package com.webtest.jsptest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author lzy
 * @version v1.0
 * Create DateTime: 2018/7/23 11:22
 * <p>
 * 注意！！！！！
 * html\jsp等文件一定要放在WEB-INF同级目录下，
 * 否则会造成无法将这类资源发布到tomcat服务器中，在浏览器中无法访问上述页面
 */
public class LoginServlet implements Servlet {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoginServlet.class);

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * Servlet的service()方法用于应答请求，每次都会调用service()方法
     * 1).ServletRequest:封装了请求信息，可以从中获取到任何的请求信息
     * 2).ServletResponse:封装了响应信息，如果想给用户什么响应，具体可以使用该接口的方法实现
     * 这两个接口的实现类都是服务器给予实现的，并在服务器调用方法的时候传入
     * <p>
     * ServletRequest:
     * 1) 获取请求参数
     * > String getParameter(String name):根据请求参数的名字，返回参数值
     * 若请求参数有多个值（例如checkbox），该方法只能获取到1个提交的值。此时需要使用下面的方法：
     * > String[] getParameterValues(String name):根据请求参数的名字，返回参数对应的字符串数组，当返回值是一个列表的时候，需要使用该方法获取一组参数
     * > Enumation getParameterValues(String name):根据请求参数的名字，返回请求参数对应的Enumeration对象，类似于ServletConfig（或ServletContext）的getInitParameterNames（）方法
     * > Map getParameterMap(): 返回请求参数的键值对，key：参数名，value：参数值，String[]
     * <p>
     * HttpServletRequest是ServletRequest的子接口，对于HTTP请求所定义，里面包含了大量获取HTTP请求相关的方法
     * <p>
     * ServletResponse
     * - HttpServletResponse
     * void sendRedirect(String location): 请求重定向，在HttpServletResponse中定义
     *
     * GenericServlet:
     * 1) 是一个Servlet，是Servelt接口和ServletConfig接口的实现类，但是一个抽象类，其中service方法为抽象方法
     * 2）如果新建的Servlet程序直接继承GenericServlet会使开发更简洁
     * 3) 具体实现
     * a.在GenericServlet中声明了一个ServletConfig类型的成员变量，在init(ServletConfig)方法中对其进行了初始化
     * b.利用servletConfig成员变量的方法实现了ServletConfig接口的方法
     * c.还定义了一个init()方法，在init（ServletConfig）方法中对其进行调用，子类可以直接覆盖init()在其中实现对Servlet的初始化
     * d.不建议直接覆盖init(ServletConfig)，因为如果忘记编写super（ServletConfig），而还是用了ServletConfig接口的方法，则会出现空指针异常
     * e.新建的init()并非Servlet的生命周期方法，而init（ServletConfig）是生命周期相关的方法
     *
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        LOGGER.info("服务来了");
        LOGGER.info(servletRequest.toString());

        /*
        String user = servletRequest.getParameter("user");
        String password = servletRequest.getParameter("password");

        LOGGER.info("name:" + user);
        LOGGER.info("password:" + password);

        String interesting = servletRequest.getParameter("interesting");
        LOGGER.info("interest:" + interesting);

        String[] interests = servletRequest.getParameterValues("interesting");
        Arrays.stream(interests).forEach(System.out::println);

        Enumeration<String> names = servletRequest.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            LOGGER.info(name + "->" + servletRequest.getParameter(name));
        }

        Map<String, String[]> map = servletRequest.getParameterMap();
        map.forEach((o1, o2) -> {
            System.out.println(o1 + "->" + o2.toString());
        });

        /*
         * 获取请求url，请求方式，可以获取http请求的一切信息
         */
        // 先将ServletRequest转换为子接口HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String requestURI = request.getRequestURI();
        LOGGER.info(requestURI);

        String requestUrl = request.getRequestURL().toString();
        LOGGER.info("url:" + requestUrl);

        String method = request.getMethod();
        LOGGER.info("method:" + method);

        /*********** servletResponse ***********/
        // getWriter() 返回Printwriter对象，调用该对象的print()方法，将内容直接输入到response的body中，显示在客户端的浏览器中
        String user = servletRequest.getParameter("user");
        PrintWriter out = servletResponse.getWriter();
        out.println("<h1>");
        if (user == null) {
            out.println("Response from server");
        } else {
            out.println("Hello " + user);
        }
        out.println("</h1>");

        // 设置响应类型
//        servletResponse.setContentType("application/msword");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
